import matplotlib.pyplot as plt
import numpy as np
import pandas as pd  # 新增数据处理库

# 解决中文显示与负号问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 2. 数据准备（使用文档提供的原始数据）
data = pd.DataFrame({
    "面积(㎡)": [52.71, 60.77, 83.35, 77.49, 32.9, 76.18, 63.48, 77.41, 86.75, 80.69, 91.23, 81.16, 85.13, 65.85, 37.11, 77.83, 62.12,
                41.28, 66.9, 86.95, 75.1, 43.08, 59.1, 97.66, 50.06, 107.09, 65.49, 98.2, 88.97, 111.42, 86.95, 73, 108.51, 28.79, 53.79,
                89.64, 107.6, 75.66, 97.03, 90.91, 84.65, 32.06, 35.56, 89.19, 23.06, 50, 39.5, 50.96, 44.81, 76.9],
    "售价(万)": [358, 420, 588, 588, 295, 499, 815, 535, 698, 660, 595, 530, 605, 465, 285, 575, 480, 276, 451, 585, 661, 250, 405,
                575, 700, 758, 470, 618, 830, 850, 575, 478, 830, 290, 660, 670, 880, 620, 735, 630, 618, 375, 240, 660, 160, 350, 368,
                350, 380, 490]
})

# 3. 数据预处理（新增：计算统计值）
stats = data.describe().T[["mean", "std", "min", "max"]].round(2)  # 统计摘要
print("数据统计摘要：\n", stats)  # 控制台输出统计信息

# 4. 创建画布与图表
plt.figure(figsize=(12, 6), dpi=150, facecolor="#f9f9f9")  # 浅灰色背景

# 5. 绘制散点图（优化：增加透明度与边框）
plt.scatter(
    data["面积(㎡)"],
    data["售价(万)"],
    s=40,          # 点大小
    c="#1f77b4",    # 蓝色主题色
    alpha=0.8,     # 透明度
    edgecolors="white",  # 白色描边
    linewidth=0.5  # 描边宽度
)

# 6. 图表修饰
# 主标题与副标题
plt.title(
    "深圳市福田区二手房面积与售价关系散点图",
    fontsize=16,
    fontweight="bold",
    pad=20
)
plt.text(
    0.5, 0.95,
    "数据来源：链家网 | 样本量：{}套".format(len(data)),
    transform=plt.gca().transAxes,
    ha="center",
    fontsize=10,
    color="#666"
)

# 坐标轴设置
plt.xlabel("房屋面积(单位：平方米)", fontsize=12)
plt.ylabel("房屋售价(单位：万元)", fontsize=12)
plt.xticks(range(20, 121, 5), fontsize=10)  # 细化刻度
plt.yticks(range(150, 901, 50), fontsize=10)

# 网格线优化
plt.grid(
    linestyle="--",
    alpha=0.4,
    color="#e0e0e0",
    which="both"
)
plt.gca().set_axisbelow(True)  # 网格置于底层

# 趋势线（新增：线性回归拟合）
z = np.polyfit(data["面积(㎡)"], data["售价(万)"], 1)
p = np.poly1d(z)
plt.plot(
    data["面积(㎡)"], p(data["面积(㎡)"], ),
    "--",
    color="#ff7f0e",
    linewidth=1.5,
    label=f"拟合方程：y = {z[0]:.2f}x + {z[1]:.2f}"
)
plt.legend(fontsize=10, loc="upper left")

# 7. 细节优化
plt.tight_layout(pad=3)  # 自动调整布局
plt.margins(0.05)        # 内边距控制
plt.gca().set_facecolor("#ffffff")  # 白色绘图区背景

# 8. 保存与显示
plt.savefig("f.png", dpi=300, bbox_inches="tight")
plt.show()